'use client'

/**
 * 前端密码工具类
 * 注意：实际的密码加密应该在后端完成，前端只做强度检查和传输编码
 */
export class PasswordCrypto {
  /**
   * 检查密码强度
   * @param password 密码
   * @returns {strong: boolean, score: number, suggestions: string[]} 密码强度信息
   */
  static checkPasswordStrength(password: string): {
    strong: boolean
    score: number
    suggestions: string[]
  } {
    const suggestions: string[] = []
    let score = 0

    // 长度检查
    if (password.length >= 8) {
      score += 1
    } else {
      suggestions.push('密码长度至少8位')
    }

    // 包含小写字母
    if (/[a-z]/.test(password)) {
      score += 1
    } else {
      suggestions.push('包含小写字母')
    }

    // 包含大写字母
    if (/[A-Z]/.test(password)) {
      score += 1
    } else {
      suggestions.push('包含大写字母')
    }

    // 包含数字
    if (/\d/.test(password)) {
      score += 1
    } else {
      suggestions.push('包含数字')
    }

    // 包含特殊字符
    if (/[!@#$%^&*(),.?":{}|<>]/.test(password)) {
      score += 1
    } else {
      suggestions.push('包含特殊字符(!@#$%^&*等)')
    }

    // 长度超过12位额外加分
    if (password.length >= 12) {
      score += 1
    }

    return {
      strong: score >= 4,
      score: Math.min(score, 5), // 最高5分
      suggestions
    }
  }
}

/**
 * 前端密码加密工具
 * 用于在前端对敏感数据进行简单加密传输
 */
export class FrontendCrypto {
  /**
   * 简单的前端密码加密（用于传输安全）
   * 注意：这不能替代后端的bcrypt加密，只是为了避免明文传输
   */
  static encodePassword(password: string): string {
    // 使用Base64编码 + 简单混淆
    const encoded = btoa(password)
    const timestamp = Date.now().toString(36)
    return `${encoded}.${timestamp}`
  }

  /**
   * 解码前端加密的密码
   */
  static decodePassword(encodedPassword: string): string {
    try {
      const [encoded] = encodedPassword.split('.')
      return atob(encoded)
    } catch (error) {
      console.error('密码解码失败:', error)
      throw new Error('密码格式错误')
    }
  }

  /**
   * 生成客户端请求签名
   * @param data 要签名的数据
   * @param timestamp 时间戳
   * @returns 签名字符串
   */
  static generateSignature(data: any, timestamp: number): string {
    const dataStr = JSON.stringify(data)
    const combined = `${dataStr}${timestamp}`
    // 简单的哈希算法（生产环境建议使用更强的算法）
    let hash = 0
    for (let i = 0; i < combined.length; i++) {
      const char = combined.charCodeAt(i)
      hash = ((hash << 5) - hash) + char
      hash = hash & hash // 转换为32位整数
    }
    return Math.abs(hash).toString(16)
  }
}

export default FrontendCrypto